package repositorios;

import excessoes.DAOException;
import interfaces.InterfaceAnexoProcessoDAO;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.hibernate.exception.ConstraintViolationException;
import entidades.AnexoProcesso;

/**
 *
 * @author Marcelo Neto
 */
public class AnexoProcessoDAOHibernate implements InterfaceAnexoProcessoDAO 
{
    private Session session;

    public void setSessao(Session session) {
        this.session = session;
    }

    @Override
    public AnexoProcesso carregarAnexo(Integer id) {
        return (AnexoProcesso) this.session.get(AnexoProcesso.class, id);
    }

    @Override
    public void incluirAnexo(AnexoProcesso anexoProcesso) throws DAOException 
    {
        try {
           this.session.save(anexoProcesso);
        }
        catch (ConstraintViolationException e) {
            throw new DAOException("Erro de chave duplicada\n" + e.getConstraintName());
        }
    }
    
    @Override
    public void alterarAnexo(AnexoProcesso anexoProcesso) throws DAOException 
    {
        Integer id = anexoProcesso.getIdanexo();
        //if (id == null || id == 0)
        //{
            AnexoProcesso anexoId = this.carregarAnexo(id);
            anexoId.setIdanexo(id);
            this.session.evict(id);
        //}
        this.session.update(anexoProcesso);
    }
    
    @Override
    public void excluirAnexo(AnexoProcesso anexoProcesso) {
        this.session.delete(anexoProcesso);
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<AnexoProcesso> listarAnexo() 
    {
        Criteria criteria = this.session.createCriteria(AnexoProcesso.class);
        criteria.addOrder((Order.desc("idprocesso")));
        criteria.addOrder((Order.asc("idanexo")));
        return criteria.list();
    }
    
    @Override
    @SuppressWarnings("unchecked")
    public List<AnexoProcesso> listarAnexosPorProcesso(int idprocesso, int idanexo)
    {
        Criteria criteria = session.createCriteria(AnexoProcesso.class);
        criteria.add(Restrictions.eq("idprocesso", idprocesso));
        criteria.add(Restrictions.eq("idanexo", idanexo));
        criteria.addOrder((Order.asc("idanexo")));
        //this.session.clear();
        return criteria.list();
    }
    
    @Override
    @SuppressWarnings("unchecked")
    public List<AnexoProcesso> listarAnexosPorProcesso(int idprocesso)
    {
        Criteria criteria = session.createCriteria(AnexoProcesso.class);
        criteria.add(Restrictions.eq("idprocesso", idprocesso));
        criteria.addOrder((Order.asc("idanexo")));
        //this.session.clear();
        return criteria.list();
    }
    
    @Override
    @SuppressWarnings("unchecked")
    public AnexoProcesso carregarAnexoPorProcesso(int idprocesso, int idanexo)
    {
        Criteria criteria = session.createCriteria(AnexoProcesso.class);
        criteria.add(Restrictions.eq("idprocesso", idprocesso));
        criteria.add(Restrictions.eq("idanexo", idanexo));
        //this.session.clear();
        return (AnexoProcesso) criteria.uniqueResult();
    }
    
    @Override
    @SuppressWarnings("unchecked")
    public List<AnexoProcesso> listarAnexosNoSetor(int unidadeAtual, int setorAtual)
    {
        Criteria criteria = session.createCriteria(AnexoProcesso.class);
        criteria.add(Restrictions.eq("unidadeAtual", unidadeAtual));
        criteria.add(Restrictions.eq("setorAtual", setorAtual));
        criteria.addOrder((Order.desc("idanexo")));
        //this.session.clear();
        return criteria.list();
    }
    
    @Override
    @SuppressWarnings("unchecked")
    public Object totalAnexosNoSetor(int unidadeAtual, int setorAtual)
    {
        //String hql="select count(*) from volume_processo where status = "+status;
        String hql="select count(*) from anexo_processo ap, processo p where p.idprocesso=ap.idprocesso and p.status = 1 and ap.unidade_atual = "+unidadeAtual+" and ap.setor_atual = "+setorAtual;
        Query consulta = this.session.createSQLQuery(hql);
        return consulta.uniqueResult();
    }
    
    @Override
    @SuppressWarnings("unchecked")
    public Object totalAnexosPorStatus(int status)
    {
        String hql="select count(*) from anexo_processo ap, processo p where p.status = "+status;
        Query consulta = this.session.createSQLQuery(hql);
        return consulta.uniqueResult();
    }
    
    @Override
    @SuppressWarnings("unchecked")
    public List<AnexoProcesso> listarAnexosPorStatus(int status)
    {
        Criteria criteria = session.createCriteria(AnexoProcesso.class);
        criteria.createAlias("processo", "p");
        criteria.add(Restrictions.eq("p.status", status));
        criteria.addOrder((Order.desc("idprocesso")));
        criteria.addOrder((Order.asc("idanexo")));
        return criteria.list();
    }
    
    @Override
    @SuppressWarnings("unchecked")
    public List<AnexoProcesso> listarAnexosPorPeriodo(Date dataIni, Date dataFim, int status)
    {
        Criteria criteria = this.session.createCriteria(AnexoProcesso.class);
        criteria.createAlias("processo", "p");
        criteria.add(Restrictions.between("p.dataProcesso", dataIni, dataFim));  
        criteria.add(Restrictions.eq("p.status", status));
        criteria.addOrder((Order.desc("idprocesso")));
        criteria.addOrder((Order.asc("idanexo")));
        return criteria.list();
    }
}